/**
 * 校验模块公共文件
 */

const Joi = require("joi");

/**
 * 校验
 * @param {*} obj 是要校验的Joi对象
 * @param {*} ctx 上下文
 * @param {Function} 下一个要执行的函数
 * @returns 
 */
const validate = (obj) => {
    return async (ctx, next) => {
        const body = ctx.request.body;
        const params = ctx.request.params;
        const hasBody = Object.keys(body).length;
        const hasParams = Object.keys(params).length;
        const result = obj.validate(hasBody ? body : hasParams ? params : ctx.request.query);
        if (result.error) {
            return ctx.body = {
                code: 0,
                msg: result.error.message
            }
        }
        await next();
    }
}
/**
 * 公共错误信息
 */
const messages = {
    'any.required': '{#label}字段必传', //required()
    'string.empty': '{#label}不能为空', //empty()
    'string.email': '{#label}格式不正确', //empty()
    'number.min': '{#label}最小为{#limit}', //Number的min()
    'number.max': '{#label}最大为{#limit}', //number的max()
    'string.pattern.base': '{#label}格式不正确',    //pattern()
    'any.only': '{#label}的值必须为{#valids}',  //valid()
    'string.min': '{#label}的最小长度为{#limit}位', //string的min()
    'string.max': '{#label}的最大长度为{#limit}位', //string的max()
    'number.base': '{#label}必须为数字',
    'number.integer': '{#label}必须为整数',  //integer()
    'string.base': '{#label}必须为字符串',
    'any.unknown': '不用传{#label}字段',
    'object.unknown': '不用传{#label}字段',
    'boolean.base': '{#label}必须为bool类型',
    'date.base': '{#label}必须为日期类型'
}

/**
 * 校验分页
 */
const validPage = Joi.object({
    pageNo: Joi.number().label('当前页码').integer().min(1).required().messages(messages),
    pageSize: Joi.number().label('每页显示条数').integer().min(1).required().messages(messages)
});


module.exports = {
    messages,
    validate,
    validPage
}